Coverage Report

Created: 2024-12-19 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
D:\a\tools.proto\tools.proto\compiler\src\compiler\enum.rs
Line
Count
Source
1
// Copyright (c) 2024, BlockProject 3D
2
//
3
// All rights reserved.
4
//
5
// Redistribution and use in source and binary forms, with or without modification,
6
// are permitted provided that the following conditions are met:
7
//
8
//     * Redistributions of source code must retain the above copyright notice,
9
//       this list of conditions and the following disclaimer.
10
//     * Redistributions in binary form must reproduce the above copyright notice,
11
//       this list of conditions and the following disclaimer in the documentation
12
//       and/or other materials provided with the distribution.
13
//     * Neither the name of BlockProject 3D nor the names of its contributors
14
//       may be used to endorse or promote products derived from this software
15
//       without specific prior written permission.
16
//
17
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29
use crate::compiler::structure::FixedFieldType;
30
use crate::compiler::util::store::name_index;
31
use crate::compiler::Error;
32
use crate::model::protocol::Description;
33
use std::collections::HashMap;
34
35
#[derive(Clone, Debug)]
36
pub struct Enum {
37
    pub name: String,
38
    pub largest: isize,
39
    pub smallest: isize,
40
    pub description: Option<Description>,
41
    pub repr_type: FixedFieldType,
42
    pub variants: Vec<(String, isize)>,
43
    pub variants_map: HashMap<String, isize>,
44
}
45
46
impl Enum {
47
7
    pub fn from_model(value: crate::model::protocol::Enum) -> Result<Enum, Error> {
48
7
        let mut variants: Vec<(String, isize)> = value.variants.into_iter().collect();
49
178
        variants.sort_by(|(_, v), (_, v1)| v.cmp(v1));
50
7
        let mut variants_map = HashMap::new();
51
7
        let 
largest6
= variants.last().map(|(_, v)|
*v6
).ok_or(Error::ZeroEnum)
?1
;
52
6
        let smallest = variants.first().map(|(_, v)| *v).ok_or(Error::ZeroEnum)
?0
;
53
58
        for (
k, v52
) in &variants {
54
52
            variants_map.insert(k.clone(), *v);
55
52
        }
56
6
        let repr_type = FixedFieldType::from_min_max_value(smallest, largest)
?0
;
57
6
        Ok(Enum {
58
6
            name: value.name,
59
6
            description: value.description,
60
6
            repr_type,
61
6
            variants,
62
6
            variants_map,
63
6
            largest,
64
6
            smallest,
65
6
        })
66
7
    }
67
}
68
69
name_index!(Enum => name);